#用Plotly可视化模拟随机漫步的情况
from random import choice

import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from plotly import offline

class RandomWalk:
    '''一个生成随机漫步数据的类'''

    def __init__(self,num_points=5000):
        '''初始化随机漫步属性'''
        self.num_points=num_points

        #所有随机漫步都始于(0,0)
        self.x_values=[0]
        self.y_values=[0]

    def fill_walk(self):
        '''计算随机漫步包含的所有顶点'''

        #不断漫步，直到列表达到指定的长度
        while len(self.x_values)<self.num_points:

            #决定前进的方向以及沿这个方向前进的距离
            x_step=self.get_step()
            y_step=self.get_step()

            #拒绝原地踏步
            if x_step==0 and y_step==0:
                continue

            #计算下一个点的x值和y值
            x=self.x_values[-1]+x_step
            y=self.y_values[-1]+y_step

            self.x_values.append(x)
            self.y_values.append(y)

    def get_step(self):
        '''确定每次漫步的距离和方向'''
        direction=choice([-1,1])
        distance=choice([0,1,2,3,4])
        return direction*distance

#创建一个RandomWalk实例
rw=RandomWalk(50_000)
rw.fill_walk()
trace = go.Scatter(x=rw.x_values, y=rw.y_values, mode='markers')
data = [trace]
offline.plot(data, filename='随机漫步.html')
